package String;
/*
此类是用于验证字符串的测试demo
1.java会将所有使用字面量（直接量）形式创建的字符串对象缓存在常量池中
  - 每当使用相同字面量形式创建字符串对象时，会复用对象，减少内存开支
  - new Sting()对象时，一定会创建新的对象
*/
public class StringDemo {
    public static void main(String[] args) {
        String s1 = "123abc";
        String s2 = "123abc";
        String s3 = "123abc";
        String s4 = new String("123abc");
        System.out.println(s1==s2);      //true,s1和s2为引用类型变量，保存的是地址值，此时地址值相同
        System.out.println(s1==s3);      //true,s1和s3为引用类型变量，保存的是地址值，此时地址值相同
        System.out.println(s2==s3);      //true,s3和s2为引用类型变量，保存的是地址值，此时地址值相同
        System.out.println(s1==s4);      //false,因为s4是通过new创建的新对象，所以地址值不一样

        String s = "123";
        String s5 = s + "abc";  //拼接字符串会产生新对象，s5指向新对象
        System.out.println(s == s5);        //false
        String s6 = "123" + "abc";
        System.out.println(s6 == s1);       //true 两个字面量拼接，会触发预计算特性，直接编程为String s6=”123abc“；

        //补充： ==  比较的是地址值。对于引用类型而言，引用中保存的是地址值
        //所以  ==  比较的是地址值，地址值相同，意味这两个引用指向了同一对象
        //对于字符串而言，实际上我们比较的是两个字符串的内容相同
        //子川内容比较，使用equals（）方法
        String s7 = "123abc";
        String s8 = new String("123abc");   //会创建新对象，因为手动new场景对象了
        System.out.println(s7 == s8);   //比较地址值
        System.out.println(s7.equals(s8));  //true，比较两个引用的内容是否相等
        int a = 10;

    }
}
